package com.indra.archetypeweb.config;

import java.util.EnumSet;
import java.util.Set;

import javax.servlet.*;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext servletContext) throws ServletException {
		
		// Crea el contexto 'root' de spring (Condiguración general)
		// 1. Packages a escanear.
		// 2. Opciones de base de datos y propiedades de conexión (persistence.properties)
		// 3. Opciones de seguridad, 'permisos de acceso según rol'. (spring-security-context.xml).
		AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
		rootContext.register(RootConfig.class); // com.indra.archetypeweb.config/RootConfig
		
		// Crea el contexto para el dispacher
		FilterRegistration.Dynamic securityFilter = servletContext.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"));
		securityFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
		
		// Gestión del ciclo de vida del contexto de 'root'.
		servletContext.addListener(new ContextLoaderListener(rootContext));
		servletContext.setInitParameter("defaultHtmlEscape", "true");
		
		// Crear y asignar el servlet MVC
//		private static final String MESSAGE_SOURCE = "/WEB-INF/i18n/messages";
//		private static final String TILES = "/WEB-INF/tiles/tiles.xml";
//		private static final String VIEWS = "/WEB-INF/views/**/views.xml";
//		
//		private static final String RESOURCES_HANDLER = "/resources/";
//		private static final String RESOURCES_LOCATION = RESOURCES_HANDLER + "**";
		AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();
		mvcContext.register(WebMvcConfig.class); // com.indra.archetypeweb.config/WebMvcConfig
		
		// Crear y asignar el servlet dispatcher
		ServletRegistration.Dynamic appServlet = servletContext.addServlet("appServlet", new DispatcherServlet(mvcContext));
		appServlet.setLoadOnStartup(1);
		Set<String> mappingConflicts = appServlet.addMapping("/");
		
		// Apache Tomcat asigna su interior DefaultServlet con "/", y en las versiones de Tomcat <= 7.0.14
		if (!mappingConflicts.isEmpty()) {
			throw new IllegalStateException("'appServlet' cannot be mapped to '/' under Tomcat versions <= 7.0.14");
		}
	}
}